//
// Created by andrew on 2024/8/11.
//

#include <iostream>
#include <string>
#include <gtest/gtest.h>

#include <iostream>
#include <vector>
using namespace std;


// 函数原型声明
void generateSubsequences(const string& str, int index, string current, vector<string>& allSubsequences) {
    // 当索引达到字符串长度时，添加当前子序列到结果容器中
    if (index == str.size()) {
        allSubsequences.push_back(current);
        return;
    }

    // 选择当前字符，也就是要当前字符
    generateSubsequences(str, index + 1, current + str[index], allSubsequences);

    // 不选择当前字符，也就是不要当前字符
    generateSubsequences(str, index + 1, current, allSubsequences);
}

void GenerateSubsequences(const string&str, int32_t index, string current, vector<string>& allSubsequences) {
    // 当前索引已经和字符串长度相同，添加当前子序列到结果容器中
    if (index < str.size())  {
        allSubsequences.push_back(current);
        return;
    }

    // index 开始0，每次都分为要和不要
    // 要当前字符
    GenerateSubsequences(str, index + 1, current + str[index], allSubsequences);
    // 字符++ 但是不要对应index 字符
    GenerateSubsequences(str, index + 1, current, allSubsequences);
}

void GenerateSubsequences(const string& str, vector<string>& allSubsequences)
{
    int n = str.length();
    int totalSubsequences = 1 << n; // 2^n possible subsequences
    for (int i = 0; i < totalSubsequences; ++i) {
        for (int j = 0; j < n; ++j) {
            // Check if the j-th bit of i is set.
            if (i & (1 << j)) {
                std::cout << str[j];
            }
        }
        std::cout << std::endl;
    }
}

/*
 *  // 调用递归函数
    permute(results, input, 0, n - 1);
 * */
//生成排列的递归函数
// str[0...start - 1]位置
// str[start...]都有机会俩到start位置
// 当start走到结束的位置，str当前的样子，就是一种结果 -> results
void Permute(vector<string>& results, string str, int start, int end) {
    if (start == end) {
        // 当到达字符串末尾时，将当前排列加入结果集
        results.push_back(str);
    }
    else
    {
        // 从 start开始，没有到i位置的都可以尝试到start位置 呢
        for (int i = start; i <= end; ++i) {
            // 交换字符
            swap(str[start], str[i]);
            // 递归调用下一个位置
            Permute(results, str, start + 1, end);
            // 恢复交换
            swap(str[start], str[i]);
        }
    }
}





TEST(DemoTest, string_process) {


    EXPECT_STREQ("da" , "da");

}